home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 112 / EnigmaAmiga112CD.iso / dalla rivista / news / orbit / source / orbit.h < prev    next >
C/C++ Source or Header  |  2000-05-01  |  21KB  |  870 lines

  1. /*
  2.  
  3. ORBIT, a freeware space combat simulator
  4. Copyright (C) 1999  Steve Belczyk <steve1@genesis.nred.ma.us>
  5.  
  6. This program is free software; you can redistribute it and/or
  7. modify it under the terms of the GNU General Public License
  8. as published by the Free Software Foundation; either version 2
  9. of the License, or (at your option) any later version.
  10.  
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with this program; if not, write to the Free Software
  18. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  19.  
  20. */
  21.  
  22. #define VERSION "1.01"
  23.  
  24. #ifdef AMIGA
  25. #define AMIGA_VERSION "0.4"
  26. #endif
  27.  
  28. #include <stdio.h>
  29. #include <time.h>
  30. #include <math.h>
  31. #include <string.h>
  32. #include <sys/types.h>
  33.  
  34. #ifndef WIN32
  35. #include <stdlib.h>
  36. #endif
  37.  
  38. #ifdef WIN32
  39. #include <windows.h>
  40. #include <GL/gl.h>
  41. #include <GL/glu.h>
  42. #include </mesa/mesa-3.0/include/GL/glut.h>
  43. #include <winsock.h>
  44. #else
  45. #include <GL/gl.h>
  46. #include <GL/glu.h>
  47. #include <GL/glut.h>
  48. #endif
  49.  
  50. #ifdef ALLOCATE
  51. #define EXTERN
  52. #else
  53. #define EXTERN extern
  54. #endif
  55.  
  56. #ifdef WIN32
  57. #pragma warning(disable:4013) /* blah() undefined; assuming extern returning int */
  58. #pragma warning(disable:4033) /* blah() must return a value */
  59. #pragma warning(disable:4716) /* blah() must return a value */
  60. #endif
  61.  
  62. /* THETA is rate of rotation in radians per second */
  63. #define THETA (1.6)
  64.  
  65. /* Maximum change in velocity, per second, at full throttle */
  66. #define DELTAV (0.2)
  67.  
  68. /* Coefficient of current velocity added to acceleration under warp speed */
  69. #define WARP_COEFF (0.2)
  70.  
  71. /* Throttle limits for arcade mode, in kps */
  72. #define MAX_THROTTLE (10000.0 / KM_TO_UNITS1)
  73. #define MAX_WARP_THROTTLE (1000000.0 / KM_TO_UNITS1)
  74.  
  75. #define SCREENWIDTH (640)
  76. #define SCREENHEIGHT (480)
  77.  
  78. void DrawScene(void);
  79. void Reshape(int, int);
  80. void MovePlayer();
  81. double Dist2();
  82. double rnd();
  83. double Time();
  84. double Theta();
  85. double Dotp();
  86. double Mag();
  87. double Mag2();
  88. void Log (char *fmt, ...);
  89. void Mprint (char *msg, ...);
  90. void Cprint (char *c, ...);
  91. void DoConnect (void);
  92. void DoChat (void);
  93. void DoDrop (void);
  94. void DoLoad (void);
  95. void DoName (void);
  96.  
  97. EXTERN int ScreenWidth, ScreenHeight;
  98. EXTERN double fov;
  99.  
  100. /* Stuff to remember about the player */
  101. #define FLIGHT_NEWTONIAN (0)
  102. #define FLIGHT_ARCADE (1)
  103. EXTERN struct
  104. {
  105.   char name[64];  /* Player name */
  106.   char model[128]; /* Ship model (for multiplayer) */
  107.   double pos[3];  /* Player position */
  108.   double up[3];  /* Camera "up" vector */
  109.   double view[3];  /* Viewing direction */
  110.   double right[3]; /* Right-hand vector */
  111.  
  112.   double move_forward, move_backward,
  113.   move_up, move_down,
  114.   move_pitchleft, move_pitchright,
  115.   move_left, move_right; /* Motion */
  116.  
  117.   int flightmodel; /* Newtonian or arcade */
  118.  
  119.   double vel[3];  /* Player's velocity */
  120.   double throttle; /* Throttle for arcade mode */
  121.   int score;   /* Player's score */
  122.  
  123.   double shields;  /* Strenth of shields */
  124.   double maxshields; /* Maximum shields */
  125.   int weapon;   /* Current weapon */
  126.   double msl_idle; /* Weapon idle time */
  127.   int waypoint;  /* Selected waypoint */
  128.   double dead_timer; /* Time to die */
  129.   int still;   /* Not changing orientation */
  130.   int viewlock;  /* True if view locked on something */
  131. }
  132. player;
  133.  
  134. /* Clipping planes */
  135. EXTERN double clipnear;
  136. EXTERN double clipfar;
  137.  
  138. #define DEAD_TIME (5.0)
  139.  
  140. EXTERN int vulnerable; /* If player can be killed */
  141.  
  142. EXTERN int joy_available; /* True if we have a joystick */
  143. /*
  144.  *  Joystick values:
  145.  *
  146.  *  x,y - stick position
  147.  *  r   - stick twist
  148.  *  z   - throttle position
  149.  */
  150. EXTERN double joy_x, joy_xmin, joy_xmax,
  151. joy_y, joy_ymin, joy_ymax,
  152. joy_r, joy_rmin, joy_rmax,
  153. joy_z, joy_zmin, joy_zmax;
  154. EXTERN int joy_buttons;  /* State of joystick buttons */
  155. EXTERN int joy_throttle;  /* True to use joystick throttle */
  156. EXTERN double deadzone;   /* Joystick dead zone */
  157.  
  158. #define DEADZONE (0.1) /* Joystick dead zone */
  159.  
  160. EXTERN int mouse_x, mouse_y; /* Stuff for mouse */
  161. EXTERN int last_mouse_x, last_mouse_y;
  162.  
  163. /* Timer stuff */
  164. #define MAXDELTAT (0.1)
  165. EXTERN long ticks_per_sec;
  166. EXTERN double deltaT;
  167. EXTERN double absT;
  168. EXTERN double fps;
  169.  
  170. #ifdef WIN32
  171. EXTERN _int64 last_ticks;
  172. #else
  173. EXTERN int last_ticks;
  174. #endif
  175.  
  176. /* Stuff for the stars */
  177. #define NSTARS (2000)
  178. EXTERN struct
  179. {
  180.   double x,y,z; /* Star coords */
  181.   double mag;  /* Star magnitude */
  182.   double bright; /* Point brightness */
  183.   double bright2; /* Brightness for sparse starfield */
  184. }
  185. star[NSTARS];
  186.  
  187. EXTERN int star_list;  /* Starfield display lists */
  188. EXTERN int star_list_sparse;
  189. EXTERN int star_list_dense;
  190. EXTERN int starfield; /* Display starfield? */
  191.  
  192. EXTERN int paused;  /* True if game paused */
  193.  
  194. /* Whether or not to display the HUD */
  195. EXTERN int drawhud;
  196.  
  197. /* Whether or not to show the frame rate */
  198. EXTERN int showfps;
  199.  
  200. /* Stuff for the message console */
  201. #define CONSLINES (10)
  202. #define CONSBUF (128)
  203. #define CONSAGE (3.0)
  204. #define CONSHEIGHT (10)
  205. EXTERN struct
  206. {
  207.   double age[CONSLINES]; /* How long each line has been on screen */
  208.   int next;  /* index of next line to use */
  209.   char buf[CONSLINES][CONSBUF]; /* messages */
  210. }
  211. console;
  212.  
  213. /* Gravity stuff */
  214. EXTERN int gravity; /* Is gravity on or off? */
  215. #define G (0.025)
  216. #define RMIN (2.0)
  217.  
  218. /* Allow full stop? */
  219. EXTERN int fullstop; /* True if full stop allowed */
  220.  
  221. /* Regular warp or super warp engines? */
  222. EXTERN int superwarp;
  223.  
  224. /* Stuff for missiles */
  225. #define NMSLS (32)
  226. #define MSL_EXPIRE (5.0)
  227. #define MSL_IDLE (0.2) /* Min seconds between missiles */
  228. #define TARGET_MSL_IDLE (2.0) /* Same for targets */
  229. #define MSL_MIN_AGE (0.1) /* Time before msl can hit something */
  230. #define MSL_VEL (0.5)
  231. EXTERN struct
  232. {
  233.   double pos[3]; /* Missile position */
  234.   double vel[3]; /* Missile velocity */
  235.   double age;  /* Missile age (0 == not in use) */
  236.   int friendly; /* True if player launced missile */
  237.   int weapon;  /* What type of weapon this is */
  238.   int owner;  /* Who owns this missile (-1 if player) */
  239. }
  240. msl[NMSLS];
  241.  
  242. /* Space junk */
  243. EXTERN int junk;   /* True to draw space junk */
  244.  
  245. /* Stuff for explosions */
  246. #define NBOOMS (32)
  247. #define BOOM_TIME (1.0) /* Length of explosion in seconds */
  248. EXTERN int palette_flash; /* True to flash whole screen */
  249. EXTERN struct
  250. {
  251.   double pos[3]; /* Explosion position */
  252.   double age;  /* Explosion age (0 == not in use) */
  253.   int light;  /* Index of corresponding light[] entry */
  254.   double angle; /* Angle to rotate boom */
  255.   double size; /* Size of this boom */
  256. }
  257. boom[NBOOMS];
  258.  
  259. #define X .525731112119133606
  260. #define Z .850650808352039932
  261.  
  262. #ifdef ALLOCATE
  263. double icos_data[12][3] =
  264. {
  265.   {
  266.     -X, 0, Z}
  267.   , {
  268.     X, 0, Z}
  269.   , {
  270.     -X, 0, -Z}
  271.   , {
  272.     X, 0, -Z}
  273.   , {
  274.     0, Z, X}
  275.   , {
  276.     0, Z, -X}
  277.   ,
  278.   {
  279.     0, -Z, X}
  280.   , {
  281.     0, -Z, -X}
  282.   , {
  283.     Z, X, 0}
  284.   , {
  285.     -Z, X, 0}
  286.   , {
  287.     Z, -X, 0}
  288.   , {
  289.     -Z, -X, 0}
  290. }
  291. ;
  292. #else
  293. extern double icos_data[12][3];
  294. #endif
  295.  
  296. #ifdef ALLOCATE
  297. int icos_index[20][3] =
  298. {
  299.   {
  300.     0, 4, 1}
  301.   , {
  302.     0, 9, 4}
  303.   , {
  304.     9, 5, 4}
  305.   , {
  306.     4, 5, 8}
  307.   , {
  308.     4, 8, 1}
  309.   ,
  310.   {
  311.     8, 10, 1}
  312.   , {
  313.     8, 3, 10}
  314.   , {
  315.     5, 3, 8}
  316.   , {
  317.     5, 2, 3}
  318.   , {
  319.     2, 7, 3}
  320.   ,
  321.   {
  322.     7, 10, 3}
  323.   , {
  324.     7, 6, 10}
  325.   , {
  326.     7, 11, 6}
  327.   , {
  328.     11, 0, 6}
  329.   , {
  330.     0, 1, 6}
  331.   ,
  332.   {
  333.     6, 1, 10}
  334.   , {
  335.     9, 0, 11}
  336.   , {
  337.     9, 11, 2}
  338.   , {
  339.     9, 2, 5}
  340.   , {
  341.     7, 2, 11}
  342. }
  343. ;
  344. #else
  345. extern int icos_index[20][3];
  346. #endif
  347.  
  348. EXTERN double boom_data[12][3];
  349.  
  350. #ifdef ALLOCATE
  351. double boom_color[12][4] =
  352. {
  353.   {
  354.     0.75, 0.75, 0.0, 1.0}
  355.   , {
  356.     0.75, 0.75, 0.0, 1.0}
  357.   , {
  358.     0.75, 0.75, 0.0, 1.0}
  359.   ,
  360.   {
  361.     0.75, 0.75, 0.0, 1.0}
  362.   , {
  363.     0.75, 0.75, 0.0, 1.0}
  364.   , {
  365.     0.75, 0.75, 0.0, 1.0}
  366.   ,
  367.   {
  368.     0.75, 0.75, 0.0, 1.0}
  369.   , {
  370.     0.75, 0.75, 0.0, 1.0}
  371.   , {
  372.     0.75, 0.75, 0.0, 1.0}
  373.   ,
  374.   {
  375.     0.75, 0.75, 0.0, 1.0}
  376.   , {
  377.     0.75, 0.75, 0.0, 1.0}
  378.   , {
  379.     0.75, 0.75, 0.0, 1.0}
  380. }
  381. ;
  382. #else
  383. extern double boom_color[12][4];
  384. #endif
  385.  
  386. /* Sound stuff */
  387. EXTERN int sound;  /* True for sound effects */
  388.  
  389. /* Constants */
  390. enum sounds {
  391.   SOUND_FIRE,
  392.   SOUND_BOOM,
  393.   SOUND_COMM,
  394.   NSOUNDS
  395. }
  396. ;
  397.  
  398. /* Functions */
  399. int InitSound (void);
  400. int PlayAudio (enum sounds);
  401. void FinishSound (void);
  402.  
  403. EXTERN int show_names; /* True to show names of things */
  404.  
  405. /* Lights stuff */
  406. #define NLIGHTS GL_MAX_LIGHTS
  407.  
  408. EXTERN struct
  409. {
  410.   float pos[4]; /* Light position */
  411.   float color[3]; /* Light color */
  412.   double age;  /* Age of light (0 == not in use) */
  413.   int gl_num;  /* GL number of light */
  414. }
  415. light[NLIGHTS];
  416.  
  417. /* Target stuff */
  418. #define NTARGETS (32)
  419. EXTERN struct
  420. {
  421.   double pos[3];  /* Target position */
  422.   double vel[3];  /* Target velocity */
  423.   double view[3];  /* Viewing direction */
  424.   double up[3];  /* Up vector */
  425.   double right[3]; /* Right vector */
  426.   double age;   /* Target age (0 == unused) */
  427.   double range2;  /* Distance from player */
  428.   double move_forward, move_backward,
  429.   move_up, move_down,
  430.   move_pitchleft, move_pitchright,
  431.   move_left, move_right; /* Motion */
  432.   double msl_idle; /* How long laucher has been idle */
  433.   char name[32];  /* Target name */
  434.   int list;   /* Target display list */
  435.   int score;   /* Points for destroying this target */
  436.   int model;   /* Index of target's model */
  437.   int strategy;  /* This target's strategy for ThinkTarget() */
  438.   int hidden;   /* True if hidden */
  439.   int invisible;   /* True if invisible */
  440.   int friendly;  /* True if on our side */
  441.   double shields;  /* Shield strength */
  442.   double maxshields; /* Maximum shields */
  443.   double shieldregen; /* How fast shields regenerate */
  444.   double turnrate; /* How fast it can turn */
  445.   double maxvel;  /* How fast it can accelerate */
  446.   int weapon;   /* Current weapon */
  447. }
  448. target[NTARGETS];
  449.  
  450. #define TARGDIST (0.02)
  451. #define TARGDIST2 (TARGDIST * TARGDIST)
  452. #define MINFIREDIST (1.0 / KM_TO_UNITS1)
  453. #define MINFIREDIST2 (MINFIREDIST * MINFIREDIST)
  454. #define MAXFIREDIST (3000.0 / KM_TO_UNITS1)
  455. #define MAXFIREDIST2 (MAXFIREDIST * MAXFIREDIST)
  456. #define TARG_MAXRANGE (50000.0 / KM_TO_UNITS1)
  457. #define TARG_MAXRANGE2 (TARG_MAXRANGE * TARG_MAXRANGE)
  458.  
  459. /* Radar stuff */
  460. EXTERN double radarR, radarCOS, radarSIN;
  461. EXTERN struct
  462. {
  463.   int center[2];  /* Center of radar on screen, in pixels */
  464.   double fcenter[2]; /* Floating version */
  465.   int radius;   /* Radius of screen, in pixels */
  466.   double fradius;  /* Floating version */
  467.   int list;   /* Display list */
  468. }
  469. radar;
  470.  
  471. /* Other HUD stuff */
  472. EXTERN struct
  473. {
  474.   double throt_min[2]; /* Coords of throttle display */
  475.   double throt_mid[2];
  476.   double throt_max[2];
  477.   double targ_name[2]; /* Coords of target name */
  478.   double targ_range[2]; /* Target range */
  479.   double vel[2];   /* Player velocity */
  480.   double shields_min[2]; /* Player shields */
  481.   double shields_max[2];
  482.   double weapon[2];  /* Weapon name */
  483.   double targshields_min[2]; /* Target shields */
  484.   double targshields_max[2];
  485.   double waypoint[2];  /* Current waypoint */
  486. }
  487. hud;
  488.  
  489. /* Shield stuff */
  490. #define SHIELD_REGEN (5.0)
  491.  
  492. /* Texture stuff */
  493. EXTERN GLubyte planet_tex[256][256][3]; /* Planet texture */
  494. EXTERN int planet_list;
  495.  
  496. /* Screen shot stuff */
  497. EXTERN int screen_shot_num;
  498.  
  499. /* Planet stuff */
  500. #define NPLANETS (32)
  501. EXTERN struct
  502. {
  503.   int hidden;   /* Don't draw */
  504.   double dist;  /* Distance from primary */
  505.   double pos[3];  /* Planet position */
  506.   double theta;  /* Solar angle */
  507.   double radius;  /* Planet size */
  508.   double oblicity; /* Oblicity (inclination from orbital plane) */
  509.   double radius2;  /* Radius squared */
  510.   double range2;  /* Distance^2 from player */
  511.   double absrange2; /* Absolute range (ignoring radius) */
  512.   double mass;  /* Mass, for gravity calculation */
  513.   float color[3];  /* Average color */
  514.   int texid;   /* Texture id */
  515.   GLubyte tex[256][256][3]; /* Texture */
  516.   char texfname[32]; /* Name of texture file */
  517.   char name[32];  /* Planet name */
  518.   int is_moon;  /* True if this is a moon */
  519.   int primary;  /* Index of primary if moon */
  520.   int list20;   /* Display lists */
  521.   int list80;
  522.   int list320;
  523.   int orbitlist;  /* Display list for orbit */
  524.   double angvel;  /* Angular velocity in degrees per second */
  525.   int custom;   /* True if customized */
  526. }
  527. planet[NPLANETS];
  528.  
  529. #define ORBIT_SECTORS (360)
  530.  
  531. /* Planet detail levels */
  532. EXTERN int slices0, stacks0,
  533. slices1, stacks1,
  534. slices2, stacks2;
  535.  
  536. EXTERN int textures; /* True to draw textures */
  537.  
  538. EXTERN int realdistances; /* True for correct planet distances */
  539.  
  540. EXTERN int draw_orbits; /* True to draw orbits */
  541. EXTERN int orbit;   /* True to make planets orbit */
  542. EXTERN double compression; /* Time compression */
  543.  
  544. EXTERN int first_vertex;  /* For texture fixing */
  545. EXTERN double maxtdiff;
  546.  
  547. /* Unit conversions */
  548. #define KM_TO_UNITS1 (6000.0) /* Radii */
  549. #define KM_TO_UNITS2 (6000.0 / 1000000.0) /* Distances */
  550.  
  551. /* Model stuff */
  552. #define NMODELS (32)
  553. EXTERN struct
  554. {
  555.   int in_use;   /* True if in use */
  556.   char name[32];  /* Model name */
  557.   int list;   /* Display list */
  558.   double lobound[3];
  559.   double hibound[3]; /* Coords of bounding box */
  560.   double radius;
  561.   double radius2;  /* Radius of bounding sphere */
  562. }
  563. model[NMODELS];
  564.  
  565. /* Mission stuff */
  566. EXTERN struct
  567. {
  568.   double cursor[3];
  569.   double player[3];
  570.   char briefing[4096];
  571.   char fn[128];
  572.   int verbose;
  573. }
  574. mission;
  575.  
  576. /* Strategies */
  577. #define STRAT_DONOTHING (0)
  578. #define STRAT_SIT1 (1)
  579. #define STRAT_SIT2 (2)
  580. #define STRAT_SIT3 (3)
  581. #define STRAT_SIT4 (4)
  582. #define STRAT_HUNT1 (5)
  583. #define STRAT_HUNT2 (6)
  584. #define STRAT_HUNT3 (7)
  585. #define STRAT_HUNT4 (8)
  586.  
  587. /* Message stuff (messages in center of screen) */
  588. EXTERN struct
  589. {
  590.   char text[4096]; /* Message text */
  591.   int len;   /* Length in pixels */
  592.   double age;   /* Age in seconds */
  593. }
  594. message;
  595.  
  596. /* Max time to keep message on screen */
  597. #define MSG_MAXAGE (30)
  598.  
  599. /* Rings stuff */
  600. #define NRINGS (4)
  601. #define MAX_RING_RANGE (200.0 * 200.0)
  602. #define RING_SECTORS (48)
  603. EXTERN struct
  604. {
  605.   int primary; /* Which planet */
  606.   int list;  /* Display list */
  607.   int texid;  /* Texture id */
  608.   GLubyte tex[256][8][4]; /* Texture */
  609.   double r1, r2; /* Inner, outer radii */
  610.   char fn[64]; /* Texture file name */
  611. }
  612. ring[NRINGS];
  613.  
  614. EXTERN int rings;  /* True to draw rings */
  615. EXTERN int ring_sectors; /* Sectors per ring */
  616.  
  617. /* Event stuff */
  618. #define NEVENTS (32)
  619. #define ACTIONS_PER_EVENT (64)
  620. EXTERN struct
  621. {
  622.   char name[32]; /* Event name */
  623.   int pending; /* True if hasn't happened yet */
  624.   int enabled; /* True if enabled */
  625.   int trigger; /* Event type */
  626.   int ivalue;  /* Event values */
  627.   double fvalue;
  628.   char *cvalue;
  629.   double pos[3]; /* Event position */
  630.  
  631.   /* Actions */
  632.   struct
  633.   {
  634.     int active;
  635.     int action;  /* Event actions */
  636.     int ivalue;
  637.     double fvalue;
  638.     char *cvalue;
  639.   }
  640.   action[ACTIONS_PER_EVENT];
  641. }
  642. event[NEVENTS];
  643.  
  644. /* Event triggers */
  645. #define EVENT_NULL (0)
  646. #define EVENT_APPROACH (1)
  647. #define EVENT_DESTROY (2)
  648. #define EVENT_SCORE (3)
  649. #define EVENT_ALARM (4)
  650. #define EVENT_DEPART (5)
  651. #define EVENT_TRUE (6)
  652. #define EVENT_STOPNEAR (7)
  653. #define EVENT_SHIELDS (8)
  654.  
  655. /* Event actions */
  656. #define EVENT_MESSAGE (10)
  657. #define EVENT_HIDE (11)
  658. #define EVENT_UNHIDE (12)
  659. #define EVENT_ENABLE (13)
  660. #define EVENT_DISABLE (14)
  661. #define EVENT_LOADMISSION (15)
  662. #define EVENT_STOP (16)
  663. #define EVENT_BOOM (17)
  664. #define EVENT_FLASH (18)
  665. #define EVENT_MOVEOBJECT (19)
  666. #define EVENT_MOVEPLAYER (20)
  667. #define EVENT_MOVEPLANET (21)
  668. #define EVENT_HIDEPLANET (22)
  669. #define EVENT_UNHIDEPLANET (23)
  670. #define EVENT_BETRAY (24)
  671.  
  672. /* Target lock stuff */
  673. #define LOCK_ENEMY (0)
  674. #define LOCK_FRIENDLY (1)
  675. #define LOCK_PLANET (2)
  676. EXTERN struct
  677. {
  678.   int target;  /* Locked target, -1 if none */
  679.   int type;  /* Target type */
  680. }
  681. lock;
  682.  
  683. /* Weapons stuff */
  684. #define NWEAPONS (10)
  685. EXTERN struct
  686. {
  687.   char name[32]; /* Name of weapon */
  688.   double yield; /* How much damage it does */
  689.   double speed; /* How fast it goes */
  690.   double idle; /* Time between shots, in seconds */
  691.   double expire; /* How long till it dissipates */
  692.   int renderer; /* How to draw */
  693.   float color[3]; /* Color */
  694.   double range2; /* Range of weapon squared */
  695. }
  696. weapon[NWEAPONS];
  697. #define NPLAYER_WEAPONS (4)
  698.  
  699. EXTERN int warpspeed; /* True if using warp engines */
  700.  
  701. /* Mouse stuff */
  702. EXTERN struct
  703. {
  704.   int left, right, up, down;
  705.   int x, y;
  706.   int flipx;
  707.   int flipy;
  708. }
  709. mouse;
  710. EXTERN int mouse_control;
  711.  
  712. /* Video mode stuff */
  713. EXTERN int fullscreen;  /* To use glutFullScreen() */
  714. EXTERN char gamemode[64]; /* To use glutGameMode() */
  715.  
  716. /* Game state stuff */
  717. #define STATE_INIT (1)
  718. #define STATE_NORMAL (2)
  719. #define STATE_DEAD1 (3)
  720. #define STATE_DEAD2 (4)
  721. #define STATE_LOADGAME (5)
  722. #define STATE_GETTEXT (6)
  723. EXTERN int state;  /* Game state */
  724.  
  725. /* Stuff for loads and saves */
  726. #define NSAVES (10)
  727. EXTERN struct
  728. {
  729.   char fn[128]; /* Mission file name */
  730.   int time; /* Time stamp */
  731. }
  732. save[NSAVES];
  733. EXTERN int nsaves;
  734.  
  735. /* Waypoints */
  736. #define NWAYPOINTS (32)
  737. EXTERN struct
  738. {
  739.   double pos[3];  /* Waypoint location */
  740. }
  741. waypoint[NWAYPOINTS];
  742. EXTERN int nwaypoints; /* Number of active waypoints */
  743.  
  744. /* 
  745.  *  Network stuff
  746.  */
  747.  
  748. #ifndef WIN32
  749. #define SOCKET int
  750. #endif
  751.  
  752. /* Undef this to use ASCII packets only.  Good if the two machines
  753.    don't use IEEE floats */
  754. #define BINARYPACKETS
  755.  
  756. #define ORBIT_PORT (2061)
  757.  
  758. /* Timing stuff */
  759. #define MAXCLIENTIDLE (60.0)
  760. #define MAXSERVERIDLE (120.0)
  761. #define PINGINTERVAL (20.0)
  762. #define CLIENTPOSINTERVAL (0.33)
  763. #define ROLLCALLINTERVAL (30.0)
  764.  
  765. #define POSNINTERVALSMALL (0.33)
  766. #define POSNINTERVALMEDIUM (0.66)
  767. #define POSNINTERVALLARGE (1.0)
  768. #define PINGFAST (100.0)
  769. #define PINGSLOW (400.0)
  770.  
  771. EXTERN int am_server; /* True if I'm a server */
  772. EXTERN int am_client; /* True if I'm a client */
  773.  
  774. void SendASCIIPacket (SOCKET socket, char *fmt, ...);
  775. void SendBinaryPacket (SOCKET socket, char *fmt, ...);
  776.  
  777. /* Stuff to remember about each client */
  778. #define NCLIENTS (8)
  779. EXTERN struct
  780. {
  781.   int active; /* True if the client is active */
  782.   int is_me; /* True if this client is me */
  783.   int target; /* Index of target structure for this client */
  784.   SOCKET socket; /* This client's socket */
  785.   double ping; /* Ping time for this client */
  786.   double posninterval; /* How often to send position reports to this client */
  787.   struct
  788.   {
  789.     double idle; /* How long since we heard from this client */
  790.     double ping; /* How long since we pinged this client */
  791.     double posn[NCLIENTS]; /* How long since we reported this client's
  792.         position to each other client */
  793.     double rollcall; /* Time since we sent a roll call to this client */
  794.   }
  795.   timer;
  796.   char pkt[1024]; /* Packet currently being received */
  797.   int ptr; /* Index of next byte in pkt */
  798.   int state; /* Binary packet state */
  799.   int remain; /* Bytes remaining in this binary packet */
  800.   int frags; /* Number of kills */
  801.   char ip[32]; /* IP address of client */
  802. }
  803. client[NCLIENTS];
  804.  
  805. /* Some server stuff */
  806. EXTERN struct
  807. {
  808.   SOCKET listening_socket; /* Socket server listens on */
  809.   int client;   /* Number of server's client */
  810.   int port;   /* Port to listen on */
  811.   char ip[32];  /* My IP address */
  812. }
  813. server;
  814.  
  815. /* Network game flags */
  816. #define FLAG_GRAVITY (0x01)
  817. #define FLAG_FLIGHTMODEL (0x02)
  818. #define FLAG_FULLSTOP (0x04)
  819. #define FLAG_REALDISTANCES (0x08)
  820. #define FLAG_ORBIT (0x10)
  821.  
  822. EXTERN struct
  823. {
  824.   SOCKET socket;  /* Socket client uses to talk to server */
  825.   char pkt[1024];  /* Packet being received */
  826.   int ptr;  /* Next byte in pkt */
  827.   int state;  /* Binary packet state */
  828.   int remain;  /* Bytes remaining in this binary packet */
  829.   int client;  /* Our client number */
  830.   int urgent;  /* We have an urgent position report */
  831.   struct
  832.   {
  833.     double server; /* Time since we heard from server */
  834.     double pos; /* Time since we last reported position */
  835.   }
  836.   timer;
  837. }
  838. clientme;
  839.  
  840. /* States for binary packets */
  841. #define NETSTATE_MAGIC (1) /* Waiting for Magic byte */
  842. #define NETSTATE_SIZE (2) /* Waiting for size byte */
  843. #define NETSTATE_PACKET (3) /* Reading packet */
  844.  
  845. #define NET_MAGIC (0x56) /* Magic start-of-packet byte */
  846.  
  847. /* Binary packet types.  HIGH BIT MUST BE SET! */
  848. #define PKT_POSS (0x80)  /* Short position */
  849. #define PKT_POSL (0x81)  /* Long position */
  850. #define PKT_POSU (0x82)  /* Urgent position */
  851. #define PKT_POSN (0x83)  /* Regular position */
  852. #define PKT_PLAN (0x84)  /* Planet position */
  853. #define PKT_VCNT (0x85)  /* Vacancy report */
  854. #define PKT_PING (0x86)  /* Ping to get latency */
  855.  
  856. EXTERN double recv_bps, xmit_bps; /* Receive, transmit rates */
  857. EXTERN int recv_bytes, xmit_bytes; /* Bytes received/sent */
  858.  
  859. /* Stuff for reading in text */
  860. #define TEXTSIZE (128)
  861. EXTERN struct
  862. {
  863.   int yes;   /* True if typing */
  864.   char buf[TEXTSIZE]; /* Buffer */
  865.   int index;   /* Index into buffer */
  866.   char prompt[32]; /* Prompt */
  867.   void (*func)(void);  /* Function to call when done */
  868. }
  869. text;
  870.